package ObjectDemo1;

/**
 * Created with IntelliJ IDEA.
 * Description:测试浅拷贝和深拷贝
 * User: 阿宾
 * Date: 2024-10-17
 * Time: 16:02
 */
public class ObjectDemo1 {
    public static void main(String[] args) throws CloneNotSupportedException {
        int[] data = {1, 2, 3};
        User u1 = new User(1, "zhangsan", data);
        User u2 = (User) u1.clone();
    }
    /*public static void main(String[] args) throws CloneNotSupportedException {
        // protected object clone(int a) 对象克隆

        //1.先创建一个对象
        int[] data = {1, 2, 3};
        User u1 = new User(1, "zhangsan", data);

        //2.克隆对象
        //细节:
        //方法在底层会帮我们创建一个对象,并把原对象中的数据拷贝过去。
        //书写细节:
        //1.重写Object中的clone方法
        //2.让javabean类实现Cloneable接口
        //3.创建原对象并调用clone就可以了
        User u2 =(User)u1.clone();
        //验证Object中的克隆是浅拷贝
        //修改u1指向的数组内容，如果u2也发生改变，
        // 说明是浅拷贝，因为两个对象数组指向的内存相同
        u1.data[0] = 100;
        System.out.println(u1.data[0]);
        System.out.println(u2.data[0]);
        //但是修改u1中的整型类型的值，不会影响u2的值,因为对于基本数据类型存储的是值，不是地址。
        u1.id = 10;
        System.out.println(u1.id);
        System.out.println(u2.id);
        //字符串验证
        //修改u1中的字符串，则会在串池中产生新的字符串，有新的地址值，
        // 然后修改u1的字符串类型存储的地址值指向新的字符串，不影响u2
        u1.name = "lisi";
        System.out.println(u1.name);
        System.out.println(u2.name);




        //验证一件事情：Object中的克隆是浅克隆
        //想要进行深克隆，就需要重[写clone方法并修改里面的方法体
        u1.data[0] = 400;

        System.out.println(u1.data[0]);
        System.out.println(u2.data[0]);


        //以后一般会用第三方工具进行克隆
        //1.第三方写的代码导入到项目中
        //2.编写代码
        //Gson gson =new Gson();
        //把对象变成一个字符串
        //String s=gson.toJson(u1);
        //再把字符串变回对象就可以了
        //User user =gson.fromJson(s, User.class);

        //int[] arr=u1.getData();
        //arr[0] = 100;

        //打印对象
        //System.out.println(user);
    }*/
}
